package com.ys.arr;

/**
 * @author CodeYang
 * @Description 4.根据索引插入元素【增】
 * *   特点：根据索引插入数组元素，效率非常非常低。
 * *   原因：a)插入元素之前，有可能需要做扩容操作。
 * *        b)因为插入元素时，需要大量的挪动元素位置。
 * *   特性：a)数组是一块连续的存储空间，相邻两个元素的存储空间是紧挨着的。
 * *        b)数组创建的时候必须明确空间长度，数组一旦创建成功，那么空间长度就不能改变啦。
 * * 5.关于数组的使用总结
 * *   我们经常去做“根据索引获取元素”的操作时，但是很少“根据索引删除元素”和“根据索引插入元素”的操作，那么建议使用数组这种数据结构来实现。
 * @Date 2020/12/11 10:03
 */
public class 插入元素到数组 {

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        arr = insertElementByArr(arr, 1, 100);
        for (int i : arr) {
            System.out.print(i + "\t");
        }

    }

    /**
     * 插入元素到数组
     *
     * @param arr     原数组
     * @param index   插入元素的指定索引位置
     * @param element 目标元素
     * @return 返回在方法中的 插入元素后的数组(数组地址值)
     */
    static int[] insertElementByArr(int[] arr, int index, int element) {
        //1: 首先应该检查数组是否需要扩容,(当数组的空间长度与存方元素的个数相等时,则需要做扩容操作)
        int size = 7;
        //一: 如果相等,则扩容 具体扩容多少应该根据实际情况来定
        if (arr.length == size) {
            // 1扩容  ---
            int[] newArr = new int[size + 1];
            // 2把原数组中的元素一次拷贝进入新数组中 后面自动默认值---0
            for (int i = 0; i < arr.length; i++) {
                newArr[i] = arr[i];
            }
            //3 如果执行了扩容,就让arr 指向扩容之后的数组,也就时让arr保存newArr的地址值
            arr = newArr;
        }
        // 二: 把插入(目标位置)索引及其之后的元素依次往后挪动一位--(挪动方向:从后往前(从最后一位开始,因为要保持值不丢失))
        // 1: 通过for ,获得插入索引及其之后的所有元素(倒序) 这里长度减2,不管是不是扩展的数组,做比较的次数
        for (int i = arr.length - 2; i >= index; i--) {
            //2 把元素往后挪动一位
            arr[i + 1] = arr[i];
        }
        // 3: 操作完之后,再插入索引位置实现复制---插入

        arr[index] = element;
        // 返回插入元素之后数组
        return arr;
    }

}
